package br.com.douglasramiro.controlefinanceiro.action;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Credentials;
import org.jboss.seam.security.Identity;

import br.com.douglasramiro.controlefinanceiro.entity.Usuario;
import br.com.douglasramiro.controlefinanceiro.util.Constantes;
import br.com.douglasramiro.controlefinanceiro.util.Criptografia;

@Name("authenticator")
public class Authenticator
{
    @Logger private Log log;

    @In Identity identity;
    @In Credentials credentials;
    @In @Out(value="usuarioLogado",scope=ScopeType.SESSION) private Usuario usuario;
    @In private FacesMessages facesMessages;
    @In private EntityManager entityManager;

    public boolean authenticate()
    {
        if (usuario == null){
        	facesMessages.add("Usuário / senha inválido");
        	return false;
        }
        try{
        	usuario = (Usuario)entityManager.createNamedQuery("usuario.logar")
        				.setParameter("user",credentials.getUsername()).getSingleResult();
        	if (!usuario.getSenha().equals(Criptografia.criptografar(credentials.getPassword()))){
        		facesMessages.add("Usuário / senha inválido");
            	return false;
        	}else if (usuario.getStatus() == Constantes.USUARIO_NAO_CONFIRMADO){
        		facesMessages.add("Sua conta ainda não foi ativada. Por favor verifique no seu email.");
            	return false;
        	}else if(usuario.getStatus() == Constantes.USUARIO_INATIVO){
        		facesMessages.add("Sua conta ainda não foi ativada. Por favor verifique no seu email.");
            	return false;
        	}else{
        		return true;
        	}
        		
        }catch(NoResultException ex){
        	facesMessages.add("Usuário / senha inválido");
        	return false;
        }catch(Exception ex){
        	ex.printStackTrace();
			Calendar cal = Calendar.getInstance(new Locale("pt","BR"));
			DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,new Locale("pt","BR"));
			facesMessages.add("Erro ao ativar usuário. \n\nHorário: "+df.format(cal.getTime())+"\n\nCausa: "+ex.toString());
			return false;	
        }
    }

}
